#include <STC15W.h>
#include <USART.h>
#include <ADC.h>
#define uchar unsigned char
#define uint unsigned int
#define TH0_TL0 (65536 - 1000)
#define ch 4

//电机输出
sbit left_M0 = P3 ^ 7;
sbit left_M1 = P3 ^ 6;
sbit right_M0 = P3 ^ 5;
sbit right_M1 = P3 ^ 4;
sbit LED0 = P1 ^ 0;

//最大速度
int MAX_SPEED = 99;
int MIN_SPEED = 15;

int count = 0;
int pwdL = 15, pwdR = 15;

//启动标志位
int start = 0;
//方向  F：前进 L：左转 R：右转 B:后退 A:加速 S:减速
uchar dir;
//串口收到数据
uchar recv;
//前方距离
uint distance = 1000;

/*******************************************************************************
* 函数名         :timerInit()
* 函数功能		   :设置定时器
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void timerInit()
{
    TMOD |= 0x01; //定时器1的工作方式2，定时器0的工作方式1，16位
    TH0 = TH0_TL0 / 256;
    TL0 = TH0_TL0 % 256;
    EA = 1;  //开启总中断
    ET0 = 1; //允许定时器0发出中断
    TR0 = 1;
}

/*******************************************************************************
* 函数名         :motorLeft()
* 函数功能		   :左轮电机控制
* 输入           : flag 1前进 0后退
* 输出         	 : 无
*******************************************************************************/
void motorLeft(int speed)
{
    if (speed >= 0)
    {
        left_M0 = 0;
        if (count < speed)
        {
            left_M1 = 1;
        }
        else
        {
            left_M1 = 0;
        }
    }
    else
    {
        left_M1 = 0;
        speed = -speed;
        if (count < speed)
        {
            left_M0 = 1;
        }
        else
        {
            left_M0 = 0;
        }
    }
}

/*******************************************************************************
* 函数名         :motorRight()
* 函数功能		 :右轮电机控制
* 输入           : flag 1前进 0后退
* 输出         	 : 无
*******************************************************************************/
void motorRight(int speed)
{
    if (speed >= 0)
    {
        right_M0 = 0;
        if (count < speed)
        {
            right_M1 = 1;
        }
        else
        {
            right_M1 = 0;
        }
    }
    else
    {
        right_M1 = 0;
        speed = -speed;
        if (count < speed)
        {
            right_M0 = 1;
        }
        else
        {
            right_M0 = 0;
        }
    }
}

/*******************************************************************************
* 函数名         :min()
* 函数功能		 :取两个值最小值
* 输入           :a  b
* 输出         	 :ab中的最小值
*******************************************************************************/
int min(int a, int b)
{
    if (a <= b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
/*******************************************************************************
* 函数名         :fabs()
* 函数功能		 :取绝对值
* 输入           :x
* 输出         	 :正整数
*******************************************************************************/
int fabs(int x)
{
    if (x < 0)
    {
        return -x;
    }
    else
    {
        return x;
    }
}

/*******************************************************************************
* 函数名         :runing()
* 函数功能		 :启动
* 输入           :无
* 输出         	 :无
*******************************************************************************/
void runing()
{
    motorLeft(pwdL);
    motorRight(pwdR);
}
/*******************************************************************************
* 函数名         :stop()
* 函数功能		 :停止
* 输入           :无
* 输出         	 :无
*******************************************************************************/
void stop()
{
    left_M1 = left_M0 = 0;
    right_M1 = right_M0 = 0;
}
/*******************************************************************************
* 函数名         :main()
* 函数功能		 :函数入口
* 输入           :无
* 输出         	 :无
*******************************************************************************/
void main()
{
    LED0 = 1;
    timerInit();
    InitSerialPort();
    // OpenADC_CHx(ch);
    while (1)
    {
        // distance = GetADCResult(ch);
        // if (distance < 100)
        // {
        //     LED0 = ~LED0;
        // }
        // else
        // {
        //     LED0 = 1;
        // }
    }
}

/*******************************************************************************
* 函数名         :timerHandler()
* 函数功能		 :定时器中断
* 输入           :无
* 输出         	 :无
*******************************************************************************/
void timerHandler() interrupt 1 using 1
{
    TR0 = 0;
    TH0 = TH0_TL0 / 256;
    TL0 = TH0_TL0 % 256;
    TR0 = 1;
    count++;

    if (count >= 100)
    {
        count = 0;
        SendString("TS");
        SendByte(0x30 + fabs(pwdL) / 10);
        SendByte(0x30 + fabs(pwdL) % 10);
        SendString("TN");
        SendByte(',');
        SendString("HS");
        SendByte(0x30 + fabs(pwdR) / 10);
        SendByte(0x30 + fabs(pwdR) % 10);
        SendString("HN");
        SendByte('\n');
    }
    if (start)
    {
        LED0 = 0;
        runing();
    }
    else
    {
        LED0 = 1;
        stop();
    }
}

//----------------------------------------------------------
//  函数名称：void SerialPortInte(void)
//  函数功能：串口中断方式接收一个字符
//----------------------------------------------------------
void SerialPortInte(void) interrupt 4
{
    RI = 0;      //清零接收标志位
    recv = SBUF; //读取缓冲区的数据

    if (recv == '0')
    {
        start = 0;
    }
    else if (recv == '1')
    {
        start = 1;
    }
    else if (recv == 'A')
    {
        if (pwdL < 0)
        {
            pwdL--;
        }
        else
        {
            pwdL++;
        }
        if (pwdL >= MAX_SPEED)
        {
            pwdL = MAX_SPEED;
        }

        if (pwdR < 0)
        {
            pwdR--;
        }
        else
        {
            pwdR++;
        }
        if (pwdR >= MAX_SPEED)
        {
            pwdR = MAX_SPEED;
        }
    }
    else if (recv == 'S')
    {
        if (pwdL < 0)
        {
            pwdL++;
        }
        else
        {
            pwdL--;
        }
        if (pwdL <= MIN_SPEED)
        {
            pwdL = MIN_SPEED;
        }
        if (pwdR < 0)
        {
            pwdR++;
        }
        else
        {
            pwdR--;
        }
        if (pwdR <= MIN_SPEED)
        {
            pwdR = MIN_SPEED;
        }
    }
    else if (recv == 'B')
    {
        if (pwdL > 0 && pwdR > 0)
        {
            pwdL = -pwdL;
            pwdR = -pwdR;
        }
    }
    else if (recv == 'F')
    {
        pwdL = pwdR = min(fabs(pwdL), fabs(pwdR));
        if (pwdL < MIN_SPEED)
        {
            pwdR = pwdL = MIN_SPEED;
        }
    }
    else if (recv == 'L')
    {
        if (pwdR != pwdL && dir != recv)
        {
            pwdR = pwdR + pwdL;
            pwdL = pwdR - pwdL;
            pwdR = pwdR - pwdL;
        }
        else
        {
            pwdR += 5;
        }
        if (pwdR >= MAX_SPEED)
        {
            pwdR = MAX_SPEED;
        }
    }
    else if (recv == 'R')
    {
        if (pwdR != pwdL && dir != recv)
        {
            pwdR = pwdR + pwdL;
            pwdL = pwdR - pwdL;
            pwdR = pwdR - pwdL;
        }
        else
        {
            pwdL += 5;
        }
        if (pwdL >= MAX_SPEED)
        {
            pwdL = MAX_SPEED;
        }
    }
    dir = recv;
}
